package service

import (
	"sugar/controller"
	"sugar/errorcode"
	"sugar/utils"

	"github.com/gin-gonic/gin"
	"gopkg.in/guregu/null.v3"
)

type createDatasetParams struct {
	Name        null.String `json:"name"`
	Type        null.Int    `json:"type"`
	Object      null.String `json:"object"`
	ObjectType  int         `json:"object_type"`
	Token       null.String `json:"token"`
	Description null.String `json:"description"`
	Public      null.Int    `json:"public"`
}

type getDatasetParams struct {
	ID null.Int `form:"id"`
}

type listDatasetParams struct {
	PageSize int `form:"page_size"`
	PageNo   int `form:"page_no"`
}

// @Summary 创建数据集
// @Description 创建数据集
// @Tags 数据集管理
// @Accept  json
// @Produce json
// @Param   params     body    createDatasetParams     true        "创建数据集参数"
// @Success 200 {object}  response.Response	"Success data为null"
// @Failure 500  {object}  response.Response  "内部错误 data为null"
// @Failure 401  {object}  response.Response  "token错误 data为null"
// @Failure 404  {object}  response.Response  "无法访问 data为null"
// @Router /dataset [post]
func createDataset(c *gin.Context, tokenMap map[string]interface{}) {
	paramOk := utils.CheckUUID4MustExist(tokenMap["user_id"])
	if !paramOk {
		panic(errorcode.ParamError)
	}
	jsonParams := createDatasetParams{
		Public:     null.NewInt(0, true),
		ObjectType: 1,
	}
	err := c.BindJSON(&jsonParams)
	if err != nil {
		panic(errorcode.ParamError)
	}
	paramOk = utils.CheckStringMustExist(jsonParams.Name, jsonParams.Object) && utils.CheckIntMustExist(jsonParams.Type, jsonParams.Public) && utils.CheckStringIfExist(jsonParams.Description, jsonParams.Token)
	if !paramOk {
		panic(errorcode.ParamError)
	}

	datasetOp := controller.NewOp()
	res := datasetOp.CreateDataset(tokenMap["user_id"].(string), jsonParams.Name.String, int(jsonParams.Type.Int64), jsonParams.Object.String, jsonParams.ObjectType, jsonParams.Token, jsonParams.Description, int(jsonParams.Public.Int64))
	c.JSON(res.StatusCode, res)
}

// @Summary 数据集详情
// @Description 数据集详情
// @Tags 数据集管理
// @Accept  json
// @Produce json
// @Param   params     body    getDatasetParams     true        "数据集ID"
// @Success 200 {object}  response.Response	"Success data为null"
// @Failure 500  {object}  response.Response  "内部错误 data为null"
// @Failure 401  {object}  response.Response  "token错误 data为null"
// @Failure 404  {object}  response.Response  "无法访问 data为null"
// @Router /dataset [get]
func getDataset(c *gin.Context, tokenMap map[string]interface{}) {
	paramOk := utils.CheckUUID4MustExist(tokenMap["user_id"])
	if !paramOk {
		panic(errorcode.ParamError)
	}
	var jsonParams getDatasetParams
	err := c.BindQuery(&jsonParams)
	if err != nil {
		panic(errorcode.ParamError)
	}
	paramOk = utils.CheckIntMustExist(jsonParams.ID)
	if !paramOk {
		panic(errorcode.ParamError)
	}
	datasetOp := controller.NewOp()
	res := datasetOp.GetDataset(tokenMap["user_id"].(string), jsonParams.ID.Int64)
	c.JSON(res.StatusCode, res)
}

// @Summary 数据集列表
// @Description 数据集列表
// @Tags 数据集管理
// @Accept  json
// @Produce json
// @Success 200 {object}  response.Response	"Success data为null"
// @Failure 500  {object}  response.Response  "内部错误 data为null"
// @Failure 401  {object}  response.Response  "token错误 data为null"
// @Failure 404  {object}  response.Response  "无法访问 data为null"
// @Router /dataset/list [get]
func listDataset(c *gin.Context, tokenMap map[string]interface{}) {
	paramOk := utils.CheckUUID4MustExist(tokenMap["user_id"])
	if !paramOk {
		panic(errorcode.ParamError)
	}
	jsonParams := listDatasetParams{
		PageNo:   0,
		PageSize: 10,
	}
	err := c.BindQuery(&jsonParams)
	if err != nil {
		panic(errorcode.ParamError)
	}
	paramOk = utils.CheckIntMustExist(jsonParams.PageNo, jsonParams.PageSize)
	datasetOp := controller.NewOp()
	res := datasetOp.ListDataset(tokenMap["user_id"].(string), jsonParams.PageSize, jsonParams.PageNo)
	c.JSON(res.StatusCode, res)
}
